package cc.wsyw126.java.utils;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Created by junpeng.yang on 17/1/11.
 */
public class RemoveAllProfile {
    /**
     * 既然removeAll执行效率低，我就改成循环remove试试看，结果是效率上有了一定的提升（在此需要注意list要倒序循环，因为remove是删除了下标，删除了之后后边的元素会前移），但是效果仍然不明显;
     * 另外一种是采用Iterator迭代器，这种方式我们仅需要对iterator进行循环，然后对需要删除的元素执行iterator.remove(iterator.next()),而无需关注下标的问题；
     * 结合list的特性，LinkedList插入更新效率高，ArrayList查询效率高,对这里的使用场景我们显然需要将集合转换成LinkedList
     * 100万数据 1369ms   java自带removeAll 10万就卡死
     *
     * @param src
     * @param oth
     * @return
     */
    public static List removeAll(List src, List oth) {
        LinkedList result = new LinkedList(src);//大集合用linkedlist
        HashSet othHash = new HashSet(oth);//小集合用hashset
        Iterator iter = result.iterator();//采用Iterator迭代器进行数据的操作
        while (iter.hasNext()) {
            if (othHash.contains(iter.next())) {
                iter.remove();
            }
        }
        return result;
    }

    public static <T> List<T> removeAll2(List<T> src, List<T> oth) {
        LinkedList<T> result = new LinkedList(src);//大集合用linkedlist
        HashSet<T> othHash = new HashSet(oth);//小集合用hashset
        List<T> collect = result.parallelStream().filter(o -> !othHash.contains(o)).collect(Collectors.toList());
        return collect;
    }

    public static <T> List<T> removeAll3(List<T> src, List<T> oth) {
        LinkedList<T> result = new LinkedList(src);//大集合用linkedlist
        result.removeAll(oth);
        return result;
    }
}
